#include "Pattern.hpp"
//#define DEBUG  1
using namespace std;

void Pattern::dumpMeasures()
{
  //this->dumper->printMeasure();
}
  
/*Boucle d'allocation*/
void Pattern::lancerSimulation()
{
  /*Tant que il y a un bloc de mémoire vivant faire :*/
  while(true){
    
    /*Parcourir la liste des blocs morts ou vivants*/
    for(int i = 0 ; i< this->PatternTaille ; i++){  
      
      
      /*Pour un bloc donné, si non alloué alors l'allouer*/
      if(allocated[i]==false){
	patternMemory[i]= new char[taillesBlocs[i]];
	allocated[i]=true;
	
#ifdef DEBUG
	cout << "Allocation d'un bloc de taille : "<<taillesBlocs[i]<<endl;
#endif
      }
      
      /*Si le bloc est alloué*/
      else{
	int v;
	if((v=sourceBinaire->getRandomBit())==1)
	  {
	    writeBlocAt(i,taillesBlocs[i]);
	  }
	/*Alors verfier s'il a atteint sa durée de vie*/
	if(this->steps == dureesBlocs[i]){
  	  /*Si durée de vie atteinte alors tuer ce bloc*/
	  //delete patternMemory[i];
	  patternMemory[i]=NULL;
	  freed[i]=true;
	  /*Augmentant ainsi le nombre de blocs libérés*/
	  this->freeds++;
	}
      }
    }
    
#ifdef DEBUG
    std::cout << "Step: "<< this->steps<< " freed: "<<this->freeds<<std::endl;
#endif
    
    this->steps++;
    
    /*Si tous les blocs on été libérés alors quitter la boucle d'allocation*/
    if(this->freeds == this->PatternTaille)
      break;
  }
}


void Pattern::writeBlocAt(unsigned int id,size_t len)
{
  
  /*L'ecriture dans le bloc doit se faire avec une certaine
    distribution aussi*/
  //printf("w bloc %d len:%ui\n",id,len);
  for(unsigned int i=0;i<len;i++){
    *((this->patternMemory[id]) + i) = 'b'; 
  }
}
